﻿'Nombre:                         CategoriaUI
'Descripcion:                    Clase que controla los cambios sobre las entidades de la categoria en la capa del cliente
'Dependencias:                 
'Fecha de creación:              20091103
'Autor:                          VMORALES
'Fecha de modifcación:         
'Responsable:                  
'Num. de modifcación:            0

Option Explicit On
Option Strict On

#Region "Imports"

Imports System.ComponentModel
Imports System.Text.RegularExpressions
Imports System.Text

#End Region

Namespace Categoria

    ''' <summary>
    ''' Clase que controla los cambios sobre las entidades de la categoria en la capa del cliente
    ''' </summary>
    Public Class CategoriaUI
        Implements IEditableObject, INotifyPropertyChanged, IDataErrorInfo

#Region "Constantes"

#End Region

#Region "Miembros"

        Private _dto As Entidades.CategoriaDTO
        Public Delegate Sub CategoriaEndEditEventHandler(ByVal sender As IEditableObject)
        Public Event CategoriaEndEdit As CategoriaEndEditEventHandler
        Public Event PropiedadCambiada(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
        Private nameEx As Regex = New Regex("^[A-Za-z ]+$")
        Private _cache As CategoriaUI
        Private _tieneErrores As Boolean = False

#End Region

#Region "Propiedades"

        ''' <summary>
        ''' Objeto de la capa de persistencia que contiene los datos correspondientes a un registro de la tabla de categorias
        ''' </summary>
        ''' <value></value>
        ''' <returns>Instancia del objeto</returns>
        Public ReadOnly Property DTO() As Entidades.CategoriaDTO
            Get
                Return _dto
            End Get
        End Property

        ''' <summary>
        ''' Identificador del registro de la tabla de categorias
        ''' </summary>
        ''' <value></value>
        ''' <returns>Valor entero del identificador del registro</returns>
        Public Property Id() As Integer
            Get
                Return _dto.Id
            End Get
            Set(ByVal value As Integer)
                _dto.Id = value
                RaisePropertyChanged("Id")
            End Set
        End Property

        ''' <summary>
        ''' Descripcion del registro de la tabla de categorias
        ''' </summary>
        ''' <value></value>
        ''' <returns>Cadena con la descripcion de la categoria</returns>
        Public Property Descripcion() As String
            Get
                Return _dto.Descripcion
            End Get
            Set(ByVal value As String)
                _dto.Descripcion = value
                RaisePropertyChanged("Descripcion")
            End Set
        End Property

        ''' <summary>
        ''' Define el estatus actual del registro de la tabla de categorias
        ''' </summary>
        ''' <value></value>
        ''' <returns>Verdadero para registros activos, falso para caso contrario</returns>
        Public Property Activo() As Boolean
            Get
                Return _dto.Activo
            End Get
            Set(ByVal value As Boolean)
                _dto.Activo = value
                RaisePropertyChanged("Activo")
            End Set
        End Property

        ''' <summary>
        ''' Define si el objeto actual tiene errores en alguna de sus propiedades
        ''' </summary>
        ''' <value></value>
        ''' <returns>Verdadero en caso de tener errores, falso en caso contrario</returns>
        Public ReadOnly Property TieneErrores() As Boolean
            Get
                Return _tieneErrores
            End Get
        End Property

#End Region

#Region "Contructores"

        Public Sub New()
            _dto = New Entidades.CategoriaDTO()
            _dto.Id = -1
            _dto.Activo = True
        End Sub

        Public Sub New(ByVal dto As Entidades.CategoriaDTO)
            _dto = dto
        End Sub

#End Region

#Region "Funciones"

        ''' <summary>
        ''' Funcion que valida los datos para la descripcion de la categoria
        ''' </summary>
        ''' <param name="_descripcion">Datos a ser validados</param>
        ''' <returns>Cadena con el mensaje para los datos invalidos, cadena vacia en caso de ser valido</returns>
        Private Function ValidarDescripcion(ByVal _descripcion As String) As String
            If String.IsNullOrEmpty(_descripcion) Then
                _tieneErrores = True
                Return "La descripcion de la categoria no puede estar vacia"
            End If

            If _descripcion.Length > 150 Then
                _tieneErrores = True
                Return "La longitud de la descripcion de la categoria es mayor a la permitida"
            End If

            If Not nameEx.Match(_descripcion).Success Then
                _tieneErrores = True
                Return "La descripcion de la categoria solo puede contener caracteres y espacios vacios"
            End If

            _tieneErrores = False
            Return String.Empty
        End Function

        ''' <summary>
        ''' Funcion que valida el identificador de la categoria
        ''' </summary>
        ''' <param name="_id">Identificador a ser validado</param>
        ''' <returns>Cadena con el mensaje para los datos invalidos, cadena vacia en caso de ser valido</returns>
        Private Function ValidarId(ByVal _id As Integer) As String
            If _id < 0 Then
                _tieneErrores = True
                Return "El identificador de la categoria no puede ser negativo"
            End If

            _tieneErrores = False
            Return String.Empty
        End Function

        Public Sub BeginEdit() Implements IEditableObject.BeginEdit
            If _cache Is Nothing Then
                _cache = New CategoriaUI()
            End If

            With _cache
                .Id = Me.Id
                .Descripcion = Me.Descripcion
                .Activo = Me.Activo
            End With
        End Sub

        Public Sub CancelEdit() Implements IEditableObject.CancelEdit
            If Not _cache Is Nothing Then
                With _cache
                    Me.Id = .Id
                    Me.Descripcion = .Descripcion
                    Me.Activo = .Activo
                End With
            End If

            _cache = Nothing
        End Sub

        Public Sub EndEdit() Implements IEditableObject.EndEdit
            _cache = Nothing

            RaiseEvent CategoriaEndEdit(Me)
        End Sub

        Private Sub RaisePropertyChanged(ByVal prop As String)
            RaiseEvent PropiedadCambiada(Me, New PropertyChangedEventArgs(prop))
        End Sub

#End Region

        Public ReadOnly Property [Error]() As String Implements IDataErrorInfo.Error
            Get
                Dim err As StringBuilder = New StringBuilder()
                Dim propError As String
                Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(Me)
                For Each prop As PropertyDescriptor In props
                    propError = Me(prop.Name)
                    If Not propError.Equals(String.Empty) Then
                        err.Append(propError + ", ")
                    End If
                Next

                If err.Length > 0 Then
                    err = err.Remove(err.Length - 2, 2)
                End If

                Return err.ToString()
            End Get
        End Property

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements IDataErrorInfo.Item
            Get
                If columnName.Equals("Descripcion") Then
                    Return ValidarDescripcion(Descripcion)
                End If

                If columnName.Equals("Id") Then
                    Return ValidarId(Id)
                End If

                Return String.Empty
            End Get
        End Property
    End Class
End Namespace
